#include<bits/stdc++.h>
using namespace std;
#define add(x,y) edge[++tail]=(dd){head[x],y},head[x]=tail;
struct dd{
    int ne,to;
}edge[10010];
int n,m,v[303],f[303][303];
int head[303],tail,size[303];
void dfs(int t){
    size[t]++;
    f[t][1]=v[t];
    for(int i=head[t];i;i=edge[i].ne){
        dfs(edge[i].to);
        for(int k=min(m,size[t]);k;k--)
        	for(int j=min(m,size[edge[i].to]);j;j--)
                f[t][k+j]=max(f[t][k+j],f[t][k]+f[edge[i].to][j]);
        size[t]+=size[edge[i].to];
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1,j;i<=n;i++){
        cin>>j>>v[i];
        add(j,i);
    }
    dfs(0);
    cout<<f[0][m+1];
}